Welcome to Hands on deep learning!

02.03.03 矩阵

正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 矩阵,我们通常用粗体、大写字母来表示 (例如X,Y、Z), 在代码中表示为具有两个轴的张量。

数学表示法使用A∈Rm*n来表示矩阵,其由行和列的实值标量组成。 我们可以将任意矩阵A∈Rm*n视为一个表格, 其中每个元素属于aiji行第j列:

对于A∈Rm*n, A的形状是(m,n)或m*n。 当矩阵具有相同数量的行和列时,其形状将变为正方形; 因此,它被称为方阵(square matrix)。

当调用函数来实例化张量时, 我们可以通过指定两个分量mn来创建一个形状为m*n的矩阵。

import torch

x=torch.arange(20).reshape(4,5)

print(x)

返回值:

tensor([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14],

[15, 16, 17, 18, 19]])

我们可以通过行索引(i)和列索引(j)来访问矩阵中的标量元素aij, 例如[A]ij。 如果没有给出矩阵A的标量元素,如在 (2.3.2)那样, 我们可以简单地使用矩阵A的小写字母索引下标aij来引用[A]ij。 为了表示起来简单,只有在必要时才会将逗号插入到单独的索引中, 例如a2,3j和[A]2i-1,3。

当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。 通常用aT来表示矩阵的转置,如果B=A, 则对于任意i和j,都有bij=aji。 因此,在 (2.3.2)中的转置是一个形状为的矩阵:

现在在代码中访问矩阵的转置。

import torch

A=torch.arange(20).reshape(4,5)

print(A)

print(A.T)

返回值:

tensor([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14],

[15, 16, 17, 18, 19]])

tensor([[ 0, 5, 10, 15],

[ 1, 6, 11, 16],

[ 2, 7, 12, 17],

[ 3, 8, 13, 18],

[ 4, 9, 14, 19]])

作为方阵的一种特殊类型,对称矩阵(symmetric matrix)A等于其转置A=AT:。 这里定义一个对称矩阵B

现在我们将B与它的转置进行比较。

import torch

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])

print(B)

print(B.T)

print(B==B.T)

返回值:

tensor([[1, 2, 3],

[2, 0, 4],

[3, 4, 5]])

tensor([[1, 2, 3],

[2, 0, 4],

[3, 4, 5]])

tensor([[True, True, True],

[True, True, True],

[True, True, True]])

矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。 例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。 曾经使用过电子表格软件或已阅读过 2.2节的人,应该对此很熟悉。 因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中, 将每个数据样本作为矩阵中的行向量更为常见。 后面的章节将讲到这点,这种约定将支持常见的深度学习实践。 例如,沿着张量的最外轴,我们可以访问或遍历小批量的数据样本。